//
//  CCHttp.h
//  CCKit
//
//  Created by tucici on 2019/3/29.
//  Copyright © 2019 tucici. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN
typedef void (^successBlock) (id response);
typedef void (^failBlock) (NSError *error);
typedef void (^progressBlock) (NSURLSession *session ,NSProgress *progress);
@interface CCHttp : NSObject

/**
 公用的地址
 */
@property (nonatomic, copy) NSString *basicURLString;

/**
 公用的参数体,建议用分类，重写get方法获取
 */
@property (nonatomic, strong) NSMutableDictionary *basicPara;
/**
 获取单例，管理http类其他属性，例如basicURLString(http://192.168.1.1),后面的请求，就简化只接api接口(index/login)

 @return 返回单例对象
 */
+ (instancetype)http;
/**
 普通get

 @param api 传入接口，例如: auth/login
 @param para 传入参数，类型=NSDictionary，例如:@{@"token":@"xxxxxxx"}
 @param success 成功回调，类型=NSDictionary
 @param fail 失败回调，
 @return 返回会话任务
 */
+ (NSURLSessionTask *)get:(nullable NSString *)api para:(nullable NSDictionary *)para success:(successBlock)success fail:(failBlock)fail;

/**
 普通post
 
 @param api 传入接口，例如: auth/login
 @param para 传入参数，类型=NSDictionary，例如:@{@"token":@"xxxxxxx"}
 @param success 成功回调，类型=NSDictionary
 @param fail 失败回调，
 @return 返回会话任务
 */
+ (NSURLSessionTask *)post:(nullable NSString *)api para:(nullable NSDictionary *)para success:(successBlock)success fail:(failBlock)fail;

/**
 上传 单张图片

 @param api 传入接口，例如: auth/upload
 @param para 传入参数，类型=NSDictionary，例如:@{@"token":@"xxxxxxx"}
 @param data 上传数据，类型=NSData
 @param progress 上传进度条
 @param success 成功回调
 @param fail 下载回调
 @return 返回会话任务
 */
+ (NSURLSessionTask *)upload:(nullable NSString *)api para:(nullable NSDictionary *)para data:(nonnull NSData *)data progress:(progressBlock)progress success:(successBlock)success fail:(failBlock)fail;

/**
 上传 多张图片

 @param api 传入接口，例如: auth/upload
 @param para 传入参数，类型=NSDictionary，例如:@{@"token":@"xxxxxxx"}
 @param dataArray 上传数据数组，类型=NSArray <NSData *> *
 @param progress 上传进度条
 @param success 成功回调
 @param fail 下载回调
 @return 返回会话任务
 */
+ (NSURLSessionTask *)upload:(nullable NSString *)api para:(nullable NSDictionary *)para dataArray:(nonnull NSArray <NSData *> *)dataArray progress:(progressBlock)progress success:(successBlock)success fail:(failBlock)fail;

/**
 下载
 
 @param api 传入接口，例如: auth/download
 @param para 传入参数，类型=NSDictionary，例如:@{@"token":@"xxxxxxx"}
 @param progress 下载进度回调
 @param success 成功回调
 @param fail 失败回调
 @return 返回下载会话任务
 */
+ (NSURLSessionDownloadTask *)download:(nullable NSString *)api para:(nullable NSDictionary *)para progress:(progressBlock)progress success:(successBlock)success fail:(failBlock)fail;

/**
 恢复下载

 @param data 其实是plist文件,只是记录下载的信息,如url,path等,而不是存储的下载数据;它之所以可以续传,是因为存储了断点续传核心range头.
 @return 返回下载会话任务
 */
+ (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)data session:(NSURLSession *)session;

/**
 预留接口，需要对response做其他判断/操作的，可以重写这个方法。
 例子：token失效，接收到response=@{@"code":101,@"msg":@"token失效"},在此方法中，解析response，弹出提示框，告诉用户token失效，并返回YES，请求回调跳出方法。

 @param response 请求收到的信息
 @return YES=请求回调跳出方法，NO=请求回调继续运行
 */
+ (BOOL)shouldReturnWithResponse:(nullable id)response;
@end

NS_ASSUME_NONNULL_END
